Los datos provistos por esta aplicación constituyen estadísticas operacionales de la Policía de Puerto Rico. Su finalidad es única y exclusivamente como medio informativo y pueden no reflejar los porcentajes actuales. https://data.pr.gov/en/Seguridad-P-blica/Incidencia-Crime-Map/3fy3-2bc5. Una copia parcial está disponible en el folder datos/.
library(tidyverse)
library(lubridate)
library(leaflet)
library(readr)
crimen_pr <- read_csv("Datos/crimen_pr.csv")
── Column specification ────────────────────────────────────────────────────────────────────────────────────
cols(
Fecha = col_date(format = ""),
Hora = col_time(format = ""),
Delito = col_double(),
Delitos_code = col_character(),
POINT_X = col_double(),
POINT_Y = col_double(),
`Area Policiaca` = col_character()
)
crimen = crimen_pr
head(crimen)
library(readr)
Incidencia_Crime_Map_2019 <- read_csv("Incidencia_Crime_Map_2019.csv")
── Column specification ────────────────────────────────────────────────────────────────────────────────────
cols(
Fecha = col_character(),
Hora = col_time(format = ""),
Delito = col_double(),
Delitos_code = col_character(),
POINT_X = col_double(),
POINT_Y = col_double(),
Location = col_character(),
`Area Policiaca` = col_character()
)
crimen_2019 = Incidencia_Crime_Map_2019
head(crimen_2019)
El paquete janitor se puede usar para limpiar los nombres de las columnas
library(janitor)
crm <- crimen_2019 %>%
clean_names() %>%
rename(longitud = point_y, latitud = point_x)
crm
Use una gráfica para verificar si hay coordenadas afuera del perímetro de la isla
crm %>%
ggplot() +
geom_point(aes(longitud, latitud))
Con el comando filter() remueva las coordenadas que son inválidas
crm <- crimen %>%
clean_names() %>%
filter(!is.na(point_x), point_x != 0) %>%
rename(longitud = point_y, latitud = point_x)
Chequee otra vez que las coordenads están dentro de los limites
crm %>%
ggplot() +
geom_point(aes(longitud, latitud))
La función map_data(), del paquete ggplot2, contiene el mapa mundial. El mapa de Puerto Rico se puede acceder usando el argumento region.
crm %>%
filter(area_policiaca=="Arecibo") %>%
ggplot() +
geom_point(aes(longitud, latitud))
pr <- map_data("world", region = "Puerto Rico")
Use geom_map() para agregar la figura del territorio
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "gray", map = pr, data = pr)
Ignoring unknown aesthetics: x, y
vea tambien https://www.r-spatial.org/r/2018/10/25/ggplot2-sf.html
fr <- map_data("world", region = "France")
fr
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "gray", map = fr, data = fr)
Ignoring unknown aesthetics: x, y
world_map <- map_data("world")
ggplot(world_map, aes(x = long, y = lat, group = group)) +
geom_polygon(fill="lightgray", colour = "white")
sort(unique(map_data("world")$region))
[1] "Afghanistan" "Albania"
[3] "Algeria" "American Samoa"
[5] "Andorra" "Angola"
[7] "Anguilla" "Antarctica"
[9] "Antigua" "Argentina"
[11] "Armenia" "Aruba"
[13] "Ascension Island" "Australia"
[15] "Austria" "Azerbaijan"
[17] "Azores" "Bahamas"
[19] "Bahrain" "Bangladesh"
[21] "Barbados" "Barbuda"
[23] "Belarus" "Belgium"
[25] "Belize" "Benin"
[27] "Bermuda" "Bhutan"
[29] "Bolivia" "Bonaire"
[31] "Bosnia and Herzegovina" "Botswana"
[33] "Brazil" "Brunei"
[35] "Bulgaria" "Burkina Faso"
[37] "Burundi" "Cambodia"
[39] "Cameroon" "Canada"
[41] "Canary Islands" "Cape Verde"
[43] "Cayman Islands" "Central African Republic"
[45] "Chad" "Chagos Archipelago"
[47] "Chile" "China"
[49] "Christmas Island" "Cocos Islands"
[51] "Colombia" "Comoros"
[53] "Cook Islands" "Costa Rica"
[55] "Croatia" "Cuba"
[57] "Curacao" "Cyprus"
[59] "Czech Republic" "Democratic Republic of the Congo"
[61] "Denmark" "Djibouti"
[63] "Dominica" "Dominican Republic"
[65] "Ecuador" "Egypt"
[67] "El Salvador" "Equatorial Guinea"
[69] "Eritrea" "Estonia"
[71] "Ethiopia" "Falkland Islands"
[73] "Faroe Islands" "Fiji"
[75] "Finland" "France"
[77] "French Guiana" "French Polynesia"
[79] "French Southern and Antarctic Lands" "Gabon"
[81] "Gambia" "Georgia"
[83] "Germany" "Ghana"
[85] "Greece" "Greenland"
[87] "Grenada" "Grenadines"
[89] "Guadeloupe" "Guam"
[91] "Guatemala" "Guernsey"
[93] "Guinea" "Guinea-Bissau"
[95] "Guyana" "Haiti"
[97] "Heard Island" "Honduras"
[99] "Hungary" "Iceland"
[101] "India" "Indonesia"
[103] "Iran" "Iraq"
[105] "Ireland" "Isle of Man"
[107] "Israel" "Italy"
[109] "Ivory Coast" "Jamaica"
[111] "Japan" "Jersey"
[113] "Jordan" "Kazakhstan"
[115] "Kenya" "Kiribati"
[117] "Kosovo" "Kuwait"
[119] "Kyrgyzstan" "Laos"
[121] "Latvia" "Lebanon"
[123] "Lesotho" "Liberia"
[125] "Libya" "Liechtenstein"
[127] "Lithuania" "Luxembourg"
[129] "Macedonia" "Madagascar"
[131] "Madeira Islands" "Malawi"
[133] "Malaysia" "Maldives"
[135] "Mali" "Malta"
[137] "Marshall Islands" "Martinique"
[139] "Mauritania" "Mauritius"
[141] "Mayotte" "Mexico"
[143] "Micronesia" "Moldova"
[145] "Monaco" "Mongolia"
[147] "Montenegro" "Montserrat"
[149] "Morocco" "Mozambique"
[151] "Myanmar" "Namibia"
[153] "Nauru" "Nepal"
[155] "Netherlands" "Nevis"
[157] "New Caledonia" "New Zealand"
[159] "Nicaragua" "Niger"
[161] "Nigeria" "Niue"
[163] "Norfolk Island" "North Korea"
[165] "Northern Mariana Islands" "Norway"
[167] "Oman" "Pakistan"
[169] "Palau" "Palestine"
[171] "Panama" "Papua New Guinea"
[173] "Paraguay" "Peru"
[175] "Philippines" "Pitcairn Islands"
[177] "Poland" "Portugal"
[179] "Puerto Rico" "Qatar"
[181] "Republic of Congo" "Reunion"
[183] "Romania" "Russia"
[185] "Rwanda" "Saba"
[187] "Saint Barthelemy" "Saint Helena"
[189] "Saint Kitts" "Saint Lucia"
[191] "Saint Martin" "Saint Pierre and Miquelon"
[193] "Saint Vincent" "Samoa"
[195] "San Marino" "Sao Tome and Principe"
[197] "Saudi Arabia" "Senegal"
[199] "Serbia" "Seychelles"
[201] "Siachen Glacier" "Sierra Leone"
[203] "Singapore" "Sint Eustatius"
[205] "Sint Maarten" "Slovakia"
[207] "Slovenia" "Solomon Islands"
[209] "Somalia" "South Africa"
[211] "South Georgia" "South Korea"
[213] "South Sandwich Islands" "South Sudan"
[215] "Spain" "Sri Lanka"
[217] "Sudan" "Suriname"
[219] "Swaziland" "Sweden"
[221] "Switzerland" "Syria"
[223] "Taiwan" "Tajikistan"
[225] "Tanzania" "Thailand"
[227] "Timor-Leste" "Tobago"
[229] "Togo" "Tonga"
[231] "Trinidad" "Tunisia"
[233] "Turkey" "Turkmenistan"
[235] "Turks and Caicos Islands" "Uganda"
[237] "UK" "Ukraine"
[239] "United Arab Emirates" "Uruguay"
[241] "USA" "Uzbekistan"
[243] "Vanuatu" "Vatican"
[245] "Venezuela" "Vietnam"
[247] "Virgin Islands" "Wallis and Futuna"
[249] "Western Sahara" "Yemen"
[251] "Zambia" "Zimbabwe"
Agrege la capa con los datos de crimen
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "grey", map = pr, data = pr) +
geom_point(aes(longitud, latitud), data = crm)
Ignoring unknown aesthetics: x, y
theme_void() remueve la información alrededor del mapa
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "gray", map = pr, data = pr) +
geom_point(aes(longitud, latitud), color = "blue", size = 0.1, data = crm) +
theme_void()
Ignoring unknown aesthetics: x, y
Los colores de los puntos se pueden
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "gray", map = pr, data = pr) +
geom_point(aes(longitud, latitud, color = area_policiaca), size = 0.5, data = crm) +
theme_void() +
theme(legend.position = "bottom")
Ignoring unknown aesthetics: x, y
facet_wrap() permite crear una “mini” gráfica por cada segmento de los datos. En este caso, area_policiaca
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "gray", map = pr, data = pr) +
geom_point(aes(longitud, latitud, color = area_policiaca), size = 0.2, data = crm) +
theme_void() +
facet_wrap(~delitos_code)
Ignoring unknown aesthetics: x, y
Ajustes se pueden hacer a los colores para obtener una mejor vista de la información.
ggplot() +
geom_map(aes(long, lat, map_id = region), fill = "black", map = pr, data = pr) +
geom_point(aes(longitud, latitud), alpha = 0.2, size = 0.1, color = "#ffff00", data = crm) +
theme_void() +
theme(panel.background = element_rect(fill = "#333333")) +
facet_wrap(~delitos_code)
Ignoring unknown aesthetics: x, y
Leaflet (https://leafletjs.com/) es una librería de JavaScript que se utiliza para hacer mapas interactivos. Es la más usada hoy en día. El paquete de R llamado leaflet permite la integración con esta librería.
En lugar de usar +, leaflet utiliza el pipe (%>%) para crear las visualizaciones. Se necesita addTiles() para agregar el mapa, y después algún tipo de puntos geográficos.
library(leaflet)
crm %>%
filter(month(fecha) == 8) %>%
leaflet() %>%
addTiles() %>%
addMarkers(~longitud, ~latitud)
Ya que son interactivos, se pueden agregar nombres que salen cuando se hace un click al punto
crm %>%
filter(month(fecha) == 8) %>%
leaflet() %>%
addTiles() %>%
addMarkers(~longitud, ~latitud, popup = ~delitos_code)
crm %>%
filter(month(fecha) == 8) %>%
leaflet() %>%
addTiles() %>%
addMarkers(~longitud, ~latitud, popup = ~paste0("Delito: ",delitos_code))
markerClusterOptions() agrupa los puntos automaticamente para que la interactividad sea más fácil
crm %>%
leaflet() %>%
addTiles() %>%
addMarkers(~longitud, ~latitud, popup = ~paste0("Delito: ",delitos_code), clusterOptions = markerClusterOptions())
crm %>%
filter(delitos_code == "Vehiculo Hurtado") %>%
leaflet() %>%
addTiles() %>%
addMarkers(~longitud, ~latitud, popup = ~paste0("Delito: ",delitos_code), clusterOptions = markerClusterOptions())